import { isNull } from './ui-utils'

export function checkLength(v, min, max) {
  if (isNull(v)) {
    return false
  }
  const len = v.length
  return len >= min && len <= max
}

export function checkCombination(pwd) {
  if (isNull(pwd)) {
    return false
  }
  let isNum = false
  let isUpper = false
  let isLower = false
  let isSpecialchar = false
  for (let i = 0; i < pwd.length; i += 1) {
    const c = pwd.charCodeAt(i)
    if ((isNum && isUpper && isLower && isSpecialchar)) {
      break
    }
    if (c >= 65 && c <= 90) {
      isUpper = true
    } else if (c >= 48 && c <= 57) {
      isNum = true
    } else if (c >= 97 && c < 122) {
      isLower = true
    } else if ((c >= 33 && c <= 47) || (c >= 58 && c <= 64) || (c >= 91 && c <= 96) || (c >= 123 && c <= 127)) {
      isSpecialchar = true
    }
  }
  // 密码不符合包括数字、小写字母、大写字母、特殊符号4类中至少3类
  let count = 0
  if (isNum) {
    count += 1
  }
  if (isUpper) {
    count += 1
  }
  if (isLower) {
    count += 1
  }
  if (isSpecialchar) {
    count += 1
  }
  if (count < 3) {
    return false
  }
  return true
}

// 4个以上连续重复字符
export function checkRepeat(pwd) {
  if (isNull(pwd)) {
    return false
  }
  for (let n = 0; n < (pwd.length - 3); n += 1) {
    if (pwd.charAt(n) === pwd.charAt(n + 1) && pwd.charAt(n + 1) === pwd.charAt(n + 2) && pwd.charAt(n + 2) === pwd.charAt(n + 3)) {
      return false
    }
  }
  return true
}

// 不能包含4个或以上连续的数字
export function checkSequenceNumber(pwd) {
  if (isNull(pwd)) {
    return false
  }
  const kbs = '0123456789'
  const kbsR = kbs.split('').reverse().join('')
  for (let n = 0; n < (pwd.length - 3); n += 1) {
    const s = pwd.charAt(n) + pwd.charAt(n + 1) + pwd.charAt(n + 2) + pwd.charAt(n + 3)
    if (kbs.indexOf(s) > -1 || kbsR.indexOf(s) > -1) {
      return false
    }
  }
  return true
}

// 校验密码输入
export const validatePassword = (rule, value, callback) => {
  if (!checkLength(value, 6, 15)) {
    return callback(new Error('密码位数必须是6至15位'))
  }
  if (!checkCombination(value)) {
    return callback(new Error('密码至少包含大小写字母、数字、特殊字符四种组合中的三种组合'))
  }
  // if (!checkRepeat(value)) {
  //   return callback(new Error('密码不能包含4个重复的数字或字母、字符'))
  // }
  // if (!checkSequenceNumber(value)) {
  //   return callback(new Error('密码不能包含4个连续的数字或字母'))
  // }
  return callback()
}
